from flask import Blueprint, jsonify, render_template, request
from pathlib import Path
import pandas as pd
import sys
import os

# 添加项目根目录到系统路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from abnormal_warning_analysis import generate_relationship_table

# 创建蓝图
abnormal_warning = Blueprint('abnormal_warning', __name__, url_prefix='/abnormal-warning')

# 配置数据文件路径
DATA_DIR = Path('data')
SOURCE_DIR = DATA_DIR / 'source'
OUTPUT_DIR = DATA_DIR / 'output'

# 确保目录存在
DATA_DIR.mkdir(parents=True, exist_ok=True)
SOURCE_DIR.mkdir(parents=True, exist_ok=True)
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

def get_relatives_data(folder_name):
    """获取指定文件夹中的亲属关系数据"""
    try:
        # 从output目录读取关系总表
        output_folder = OUTPUT_DIR / folder_name
        file_path = output_folder / "关系总表.xlsx"
        print(f"\n[DEBUG] 尝试读取关系总表: {file_path}")
        
        if not file_path.exists():
            print(f"[DEBUG] 关系总表不存在: {file_path}")
            return []
            
        # 读取Excel文件，确保所有列都作为字符串读取
        print(f"[DEBUG] 开始读取Excel文件: {file_path}")
        df = pd.read_excel(file_path, dtype=str)
        print(f"[DEBUG] Excel文件读取成功，列名: {df.columns.tolist()}")
        
        # 只保留关系类型为'亲属'的行的名称和关系列
        if '名称' in df.columns and '关系' in df.columns and '关系类型' in df.columns:
            print(f"[DEBUG] 找到名称、关系和关系类型列")
            # 筛选亲属关系数据
            df = df[df['关系类型'].astype(str) == '亲属']
            # 去除名称为空的行
            df = df[df['名称'].notna()]
            print(f"[DEBUG] 去除空名称后的行数: {len(df)}")
            # 去除重复值
            df = df.drop_duplicates(subset=['名称'])
            print(f"[DEBUG] 去除重复后的行数: {len(df)}")
            # 返回处理后的数据
            result = df[['名称', '关系']].values.tolist()
            print(f"[DEBUG] 返回的亲属数据数量: {len(result)}")
            print(f"[DEBUG] 亲属数据示例: {result[:3] if result else '无数据'}")
            return result
        else:
            print(f"[DEBUG] 未找到必要的列，现有列: {df.columns.tolist()}")
            return []
    except Exception as e:
        print(f"[DEBUG] 读取关系总表出错 {file_path}: {str(e)}")
        import traceback
        traceback.print_exc()
        return []

def get_special_business_relationships(folder_name):
    """获取指定文件夹中的特定关系人和三商清单数据"""
    try:
        # 从output目录读取关系总表
        output_folder = OUTPUT_DIR / folder_name
        file_path = output_folder / "关系总表.xlsx"
        print(f"\n[DEBUG] 尝试读取关系总表: {file_path}")
        
        if not file_path.exists():
            print(f"[DEBUG] 关系总表不存在: {file_path}")
            return []
            
        # 读取Excel文件，确保所有列都作为字符串读取
        print(f"[DEBUG] 开始读取Excel文件: {file_path}")
        df = pd.read_excel(file_path, dtype=str)
        print(f"[DEBUG] Excel文件读取成功，列名: {df.columns.tolist()}")
        
        # 只保留关系类型为'特定关系人'或'三商清单'的行的名称和关系列
        if '名称' in df.columns and '关系' in df.columns and '关系类型' in df.columns:
            print(f"[DEBUG] 找到名称、关系和关系类型列")
            # 筛选特定关系人和三商清单数据
            df = df[df['关系类型'].astype(str).isin(['特定关系人', '三商清单'])]
            # 去除名称为空的行
            df = df[df['名称'].notna()]
            print(f"[DEBUG] 去除空名称后的行数: {len(df)}")
            # 去除重复值
            df = df.drop_duplicates(subset=['名称'])
            print(f"[DEBUG] 去除重复后的行数: {len(df)}")
            # 返回处理后的数据
            result = df[['名称', '关系', '关系类型']].values.tolist()
            print(f"[DEBUG] 返回的特定关系人和三商清单数据数量: {len(result)}")
            print(f"[DEBUG] 数据示例: {result[:3] if result else '无数据'}")
            return result
        else:
            print(f"[DEBUG] 未找到必要的列，现有列: {df.columns.tolist()}")
            return []
    except Exception as e:
        print(f"[DEBUG] 读取关系总表出错 {file_path}: {str(e)}")
        import traceback
        traceback.print_exc()
        return []

@abnormal_warning.route('/')
def index():
    """渲染异常预警页面，并生成关系总表"""
    # 生成关系总表
    generate_relationship_table()
    return render_template('pages/abnormal_warning.html', active_page='abnormal_warning')

@abnormal_warning.route('/load-data', methods=['GET'])
def load_data():
    """加载已有的分析结果数据"""
    try:
        print(f"\n[DEBUG] 开始加载数据")
        print(f"[DEBUG] 当前工作目录: {os.getcwd()}")
        print(f"[DEBUG] SOURCE_DIR: {SOURCE_DIR.absolute()}")
        print(f"[DEBUG] OUTPUT_DIR: {OUTPUT_DIR.absolute()}")
        
        if not OUTPUT_DIR.exists():
            return jsonify({
                'success': False,
                'error': '未找到数据目录'
            })

        folders_data = []
        
        # 遍历output目录下的所有文件夹
        for folder in OUTPUT_DIR.iterdir():
            if folder.is_dir():
                folder_name = folder.name
                print(f"\n[DEBUG] 处理文件夹: {folder_name}")
                
                # 获取关系数据
                print(f"[DEBUG] 开始获取关系数据")
                relatives = get_relatives_data(folder_name)
                special_business = get_special_business_relationships(folder_name)
                print(f"[DEBUG] 获取到亲属数量: {len(relatives)}")
                print(f"[DEBUG] 获取到特定关系人和三商清单数量: {len(special_business)}")
                
                folders_data.append({
                    'name': folder_name,
                    'exists': True,
                    'relatives': relatives,
                    'special_business': special_business
                })
                print(f"[DEBUG] 已添加文件夹数据: {folder_name}")

        if not folders_data:
            return jsonify({
                'success': False,
                'error': '未找到任何数据'
            })

        print(f"[DEBUG] 返回数据: 文件夹数量={len(folders_data)}")
        return jsonify({
            'success': True,
            'folders': folders_data
        })

    except Exception as e:
        print(f"[DEBUG] 加载数据时出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return jsonify({
            'success': False,
            'error': f'加载数据时出错: {str(e)}'
        }) 